package com.liyao.wftwnetdesk;

import com.liyao.wftwnetdesk.Utils.SocketClientUtil;
import javafx.animation.PauseTransition;
import javafx.application.Platform;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.stage.Stage;
import javafx.util.Duration;

import java.io.IOException;
import java.net.URL;
import java.util.Map;
import java.util.ResourceBundle;

import static com.liyao.wftwnetdesk.Utils.NetworkInfoExtractor.NetworkInfoExtractor;
import static com.liyao.wftwnetdesk.Utils.getWiFiName.getWiFiName;

public class HelloController implements Initializable {

    @FXML
    public Label localIP;

    @FXML
    public TextField wrenchNameText;
    public TextField SNText;
    public TextField SSIDText;
    public TextField ipAddressText;
    public TextField SubnetMaskTest;
    public TextField oldIpAddressText;
    public TextField passwordText;
    public TextField portText;
    public TextField gatewayText;
    public TextField oldPortText;
    public Label wifiName;
    private Service<Void> service;
    private SocketClientUtil clientUtil;
    private boolean isAdd=false;

    @FXML


    public void updateWrenchSubmit(ActionEvent actionEvent) {
        boolean isValid = true;
        isValid &= !isTextFieldEmptyOrWhitespace(SSIDText, "请填写Wi-Fi名称");
        isValid &= !isTextFieldEmptyOrWhitespace(passwordText, "请填写Wi-Fi密码");
        isValid &= !isTextFieldEmptyOrWhitespace(ipAddressText, "请填写扳手的IP地址");
        isValid &= !isTextFieldEmptyOrWhitespace(portText, "请填写扳手的端口号");
        isValid &= !isTextFieldEmptyOrWhitespace(SubnetMaskTest, "请填写子网掩码");
        isValid &= !isTextFieldEmptyOrWhitespace(gatewayText, "请填写网关");
        isValid &= !isTextFieldEmptyOrWhitespace(oldIpAddressText, "请填写原IP地址");
        isValid &= !isTextFieldEmptyOrWhitespace(oldPortText, "请填写原端口号");

        if (isValid) {
            //下发给扳手IP地址和端口
            this.service = new Service<>() {
                // 添加一个取消标志
                private volatile boolean cancelled = false;
                //            private volatile boolean isAdd1 = false;
                @Override
                protected Task<Void> createTask() {
                    return new Task<Void>() {
                        @Override
                        protected Void call() throws Exception {

                            int maxRetries = 8;
                            int retryCount = 0;

                            while (!cancelled && retryCount < maxRetries) {
                                updateMessage("正在第" + (retryCount + 1) + "次连接扳手配置网络");
                                System.out.println("原IP："+oldIpAddressText.getText()+";原端口"+oldPortText.getText());
                                clientUtil = new SocketClientUtil(oldIpAddressText.getText(), Integer.parseInt(oldPortText.getText()));
                                try{
                                    // 建立连接
                                    clientUtil.connect();
                                    System.out.println("RSWS;01;"+SNText.getText()+";01;"+SSIDText.getText()+";"+passwordText.getText()+";"+ipAddressText.getText()+";"+SubnetMaskTest.getText()+";"+gatewayText.getText()+";"+portText.getText()+";;\r\n");
                                    // 发送消息到服务器
                                    clientUtil.sendMessage("RSWS;01;"+SNText.getText()+";01;"+SSIDText.getText()+";"+passwordText.getText()+";"+ipAddressText.getText()+";"+SubnetMaskTest.getText()+";"+gatewayText.getText()+";"+portText.getText()+";;\r\n");
                                    // 从服务器接收消息
                                    String response = clientUtil.receiveMessage();
                                    System.out.println("Server response: " + response);

                                    // 连接成功
                                    updateMessage("下发成功");

                                    //把扳手信息插入文档中
                                    clientUtil.close();
                                    cancelled=true;
                                    break;

                                } catch (IOException ex) {
                                    retryCount++;
                                    if (retryCount >= maxRetries) {
                                        updateMessage("连接失败，已达到最大重试次数");
                                    }

                                    // 模拟延迟
                                    Thread.sleep(1000);
                                }
                            }
                            if (isCancelled()) {
                                updateMessage("任务已取消");
                            }
                            return null;
                        }
                        @Override
                        protected void cancelled() {
                            super.cancelled();
                            // 当任务被取消时，设置取消标志（这通常会在调用service.cancel()时自动发生）
                            cancelled = true;
                            // 您可能还需要在这里添加额外的清理逻辑，比如关闭已经打开的Socket等
                        }
                    };
                }
            };
            Dialog<Void> dialog = createDialog("正在连接扳手配置网络...");
//        service.setOnSucceeded(event -> dialog.close());
            service.setOnSucceeded(event -> {
                isAdd=true;
                Stage stage = (Stage) ((Button) actionEvent.getSource()).getScene().getWindow();
//                stage.close();
                PauseTransition delay = new PauseTransition(Duration.seconds(3)); // 延迟3秒
//                delay.setOnFinished(event2 -> dialog.close()); // 延迟结束后关闭对话框
                delay.play();
            });
            // 在对话框关闭时取消服务
            dialog.setOnCloseRequest(event -> {
                isAdd=false;
                if (service.isRunning()) {
                    service.cancel();
                    try {
                        clientUtil.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                dialog.close(); // 这行通常不需要，因为对话框已经在关闭请求中了
            });

            service.start();

            dialog.showAndWait();

            System.out.println("我提交了");
        }
    }

    private boolean isTextFieldEmptyOrWhitespace(TextField textField, String errorMessage) {
        String text = textField.getText().trim();
        if (text.isEmpty()) {
            showAlert(Alert.AlertType.ERROR,"验证错误", "请填写所有必填项",errorMessage);
            System.err.println(errorMessage);
            return true;
        }
        return false;
    }

    private Dialog<Void> createDialog(String title) {
        Dialog<Void> dialog = new Dialog<>();
        dialog.setTitle(title);
        dialog.setHeaderText(null);
        dialog.setGraphic(null);

        // 创建一个带有首选尺寸的Label
        Label label = new Label();
        label.setPrefWidth(400); // 设置首选宽度，可以根据需要调整
        label.setWrapText(true); // 启用文本换行
        dialog.getDialogPane().setContent(label);

        dialog.getDialogPane().getButtonTypes().addAll(ButtonType.CLOSE);

        // 更新标签内容
        service.messageProperty().addListener((obs, oldMessage, newMessage) -> {
            Platform.runLater(() -> label.setText(newMessage));
        });

        // 尝试调整对话框的初始尺寸（这不是标准方法，但可能有助于在某些情况下改善显示效果）
        // 注意：这种方法的效果可能因JavaFX版本和平台而异
        dialog.getDialogPane().prefWidthProperty().bind(label.prefWidthProperty());
        dialog.getDialogPane().prefHeightProperty().bind(label.prefHeightProperty().add(50)); // 额外的高度用于按钮等

        // 由于prefHeight的绑定可能不够准确（因为还包括了按钮和其他元素），您可能需要手动设置一个更大的值
        // 或者，您可以在对话框显示后使用反射或其他技巧来调整其尺寸（这通常不推荐，因为它依赖于内部实现）

        // 一个更好的方法是使用Stage并完全自定义对话框的外观和尺寸
        // 但这将需要更多的工作，并且会失去Dialog类提供的一些便利功能

        return dialog;
    }

    private void showAlert(Alert.AlertType alertType, String title, String headerText,String ContentText) {
        Alert alert = new Alert(alertType);
        alert.setTitle(title);
        alert.setHeaderText(headerText);
        alert.setContentText(ContentText); // 可以根据需要自定义内容文本
        alert.showAndWait(); // 显示对话框并等待用户响应
    }

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        Map<String,String> netMap=NetworkInfoExtractor();
        if(netMap!=null) {
            localIP.setText(netMap.get("ipv4Address"));
            wifiName.setText(getWiFiName());
        }
    }
}
